// lib/api/post_api.dart
import 'dart:async';

import 'package:dio/dio.dart';
import '../models/response.dart';
import '../models/post.dart';
import 'dio_client.dart';

class PostApi {
  final Dio _dio = DioClient().dio;

  /// 获取帖子列表
  /// [page] 页码
  /// [size] 每页数量
  /// [order] 排序方式 (可选值: 'time' 按时间, 'hot' 按热度)
  /// [communityId] 社区ID (0 表示所有社区)
  Future<ResponseSuccess<List<Post>>> getPosts({
    int page = 1,
    int size = 10,
    String order = 'time',
    int? communityId,
  }) async {
    try {
      Response response;

      // 根据社区ID选择不同的API路径
      if (communityId == null || communityId == 0) {
        // 所有社区的帖子 - 调用 /posts2 接口
        response = await _dio.get(
          '/posts2',
          queryParameters: {
            'page': page,
            'size': size,
            'order': order,
          },
        );
      } else {
        // 特定社区的帖子 - 调用 /community/{id}/posts 接口
        response = await _dio.get(
          '/community/$communityId/posts',
          queryParameters: {
            'page': page,
            'size': size,
            'order': order,
          },
        );
      }

      return ResponseSuccess.fromJson(
        response.data,
            (json) => (json as List).map((e) => Post.fromJson(e as Map<String, dynamic>)).toList(),
      );
    } on DioException catch (e) {
      final errorMessage = e.response?.data?['msg'] ?? '获取帖子列表失败';
      throw 'Error $errorMessage (Status: ${e.response?.statusCode})';
    } catch (e) {
      throw '获取帖子列表发生未知错误: $e';
    }
  }

  /// 获取帖子详情
  Future<ResponseSuccess<Post>> getPostDetail(String postId) async { // postId 为 String 类型
    try {
      final response = await _dio.get('/post/$postId'); // 获取帖子详情的 API 路径
      // 使用 ResponseSuccess 泛型解析响应
      return ResponseSuccess.fromJson(
        response.data,
            (json) => Post.fromJson(json as Map<String, dynamic>),
      );
    } on DioException catch (e) {
      // 捕获 Dio 错误，并尝试从响应中获取错误信息
      throw e.response?.data['msg'] ?? '获取帖子详情失败，请稍后再试。';
    } catch (e) {
      // 其他未知错误
      throw '获取帖子详情发生未知错误: $e';
    }
  }


  /// [title] 帖子标题
  /// [content] 帖子内容
  /// [communityId] 所属社区ID
  Future<ResponseSuccess<void>> createPost({
    required String title,
    required String content,
    required int communityId,
  }) async {
    try {
      final response = await _dio.post(
        '/post', // **这是你curl命令中的POST接口路径**
        data: {
          'title': title,
          'content': content,
          'community_id': communityId,
        },
      );
      // 创建帖子成功后，后端响应通常只包含 code 和 msg，没有 data
      return ResponseSuccess.fromJson(
        response.data,
            (json) => null, // 没有具体数据需要解析，传入 null
      );
    } on DioException catch (e) {
      final errorMessage = e.response?.data?['msg'] ?? '创建帖子失败';
      throw 'Error: $errorMessage (Status: ${e.response?.statusCode})';
    } catch (e) {
      throw '创建帖子发生未知错误: $e';
    }
  }


  /// 切换帖子的点赞状态（如果已点赞则取消，未点赞则点赞）。
  /// [postId] 帖子的ID。
  Future<ResponseSuccess<void>> toggleLikeStatus(String postId) async {
    // === 添加打印日志 ===
    // 删除了所有尝试将 String 转换为 int 的代码
    print('toggleLikeStatus - Received postId (String): $postId');
    // ==================

    try {
      final response = await _dio.post(
        '/like/toggle',
        data: {
          // 直接使用 String 类型的 postId，因为它来自传入参数，且你确认后端也接受 String
          'post_id': postId,
        },
      );
      return ResponseSuccess.fromJson(response.data, (json) => null);
    } on DioException catch (e) {
      final errorMessage = e.response?.data?['msg'] ?? '切换点赞状态失败';
      // === 添加打印日志 ===
      print('toggleLikeStatus - DioError: $errorMessage (Status: ${e.response?.statusCode})');
      print('toggleLikeStatus - DioError Response Data: ${e.response?.data}');
      // ==================
      throw 'Error: $errorMessage (Status: ${e.response?.statusCode})';
    } catch (e) {
      // 捕获 DioError 之外的其他未知错误
      // === 添加打印日志 ===
      print('toggleLikeStatus - Unknown Error: $e');
      // ==================
      throw '切换点赞状态发生未知错误: $e';
    }
  }


  /// 给指定的帖子点赞。
  /// [postId] 帖子的ID。
  /// **注意：你的 `likePost` 目前也调用了 `/like/toggle`。**
  /// **如果你希望它是一个独立的点赞（非切换）接口，请确保后端有 `/like` 这样的接口。**
  /// **否则，这个方法可能与 `toggleLikeStatus` 重复或功能不符。**
  Future<ResponseSuccess<void>> likePost(String postId) async {
    try {
      final response = await _dio.post(
        '/like', // 假设这里是独立的点赞接口，如果不是，可能需要移除此方法或使其功能一致
        data: {
          // 假设后端期望 post_id 是 int 类型
          'post_id': postId,
        },
      );

      return ResponseSuccess.fromJson(response.data, (json) => null);
    } on DioException catch (e) {
      final errorMessage = e.response?.data?['msg'] ?? '点赞失败';
      throw 'Error: $errorMessage (Status: ${e.response?.statusCode})';
    } catch (e) {
      throw '点赞发生未知错误: $e';
    }
  }


  /// 获取当前用户对指定帖子的点赞状态。
  /// [postId] 帖子的ID。
  /// 返回 `true` 如果已点赞，`false` 如果未点赞。
  Future<ResponseSuccess<bool>> getLikeStatus(String postId) async {
    try {
      final response = await _dio.get('/like/status/$postId');
      // 后端返回的数据结构是 { "code": 1000, "msg": "success", "data": { "liked": true/false } }
      return ResponseSuccess.fromJson(response.data, (json) {
        if (json is Map<String, dynamic> && json.containsKey('data')) {
          final data = json['data'];
          if (data is Map<String, dynamic> && data.containsKey('liked')) {
            return data['liked'] as bool;
          } else {
            // 处理 data 字段不是 Map 或没有 "liked" 键的情况
            print('getLikeStatus: data 字段不是 Map 或没有 "liked" 键');
            return false; // 或者抛出异常，具体取决于你的错误处理策略
          }
        } else {
          // 处理 json 不是 Map 或没有 "data" 键的情况
          print('getLikeStatus: json 不是 Map 或没有 "data" 键');
          return false; // 或者抛出异常
        }
      });
    } on DioException catch (e) {
      final errorMessage = e.response?.data?['msg'] ?? '获取点赞状态失败';
      throw 'Error: $errorMessage (Status: ${e.response?.statusCode})';
    } catch (e) {
      print('getLikeStatus unknown error: $e');
      throw '获取点赞状态发生未知错误: $e';
    }
  }




  /// 根据关键字搜索帖子
  /// [keyword] 搜索关键字
  /// [page] 页码
  /// [size] 每页数量
  /// 返回符合条件的帖子列表
  Future<ResponseSuccess<List<Post>>> searchPosts({
    required String keyword,
    int page = 1,
    int size = 10,
  }) async {
    try {
      final response = await _dio.get(
        '/posts/search', // 后端搜索接口路径
        queryParameters: {
          'keyword': keyword,
          'page': page,
          'size': size,
        },
      );

      // 解析响应数据，将其转换为 Post 对象的列表
      return ResponseSuccess.fromJson(
        response.data,
            (json) => (json as List).map((e) => Post.fromJson(e as Map<String, dynamic>)).toList(),
      );
    } on DioException catch (e) {
      final errorMessage = e.response?.data?['msg'] ?? '搜索帖子失败';
      throw '错误: $errorMessage (状态码: ${e.response?.statusCode})'; // 中文输出
    } catch (e) {
      throw '搜索帖子发生未知错误: $e'; // 中文输出
    }
  }
  /// 获取用户发布的帖子列表
  /// [userId] 用户ID
  Future<ResponseSuccess<List<Post>>> getUserPosts() async {
    try {
      final response = await _dio.get(
        '/user/public_posts',
      );
      return ResponseSuccess.fromJson(
        response.data,
            (json) => (json as List).map((e) => Post.fromJson(e as Map<String, dynamic>)).toList(),
      );
    } on DioException catch (e) {
      final errorMessage = e.response?.data?['msg'] ?? '获取用户帖子列表失败';
      throw '错误: $errorMessage (状态码: ${e.response?.statusCode})';
    } catch (e) {
      throw '获取用户帖子列表发生未知错误: $e';
    }
  }

  /// 删除用户自己发布的帖子。
  /// [postId] 待删除帖子的ID。
  Future<ResponseSuccess<void>> deleteUserPost(String postId) async {
    try {
      final response = await _dio.post( // 根据你的 cURL 命令，这是 POST 请求
        '/user/delete_public_posts', // cURL 命令中的接口路径
        data: {
          'post_id': postId, // cURL 命令中的请求体字段
        },
      );
      // 删除成功后，后端响应通常只包含 code 和 msg，没有 data
      return ResponseSuccess.fromJson(
        response.data,
            (json) => null, // 没有具体数据需要解析，传入 null
      );
    } on DioException catch (e) {
      final errorMessage = e.response?.data?['msg'] ?? '删除帖子失败';
      // 打印详细错误信息，方便调试
      print('deleteUserPost - DioError: $errorMessage (Status: ${e.response?.statusCode})');
      print('deleteUserPost - DioError Response Data: ${e.response?.data}');
      throw 'Error: $errorMessage (Status: ${e.response?.statusCode})';
    } catch (e) {
      print('deleteUserPost - Unknown Error: $e');
      throw '删除帖子发生未知错误: $e';
    }
  }

}